package com.tjetc.interceptor;

import com.tjetc.entity.Users;
import com.tjetc.service.UsersService;
import com.tjetc.util.R;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component // 交给 Spring 管理
public class TokenInterceptor implements HandlerInterceptor {

    @Autowired
    private UsersService usersService; // 注入你的 UsersService
    // 新增构造方法
    public TokenInterceptor() {
        System.out.println("=== TokenInterceptor 已被 Spring 初始化 ===");
    }
    /**
     * 请求处理前执行（拦截请求）
     * @return true：放行；false：拦截（不继续执行后续接口）
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 排除不需要鉴权的接口（如登录、注册接口，避免拦截）1
        String requestURI = request.getRequestURI();
        // 示例：排除 /login（登录）、/register（注册）接口，可根据你的实际接口调整
        if (requestURI.contains("/users/login") || requestURI.contains("users/register")) {
            return true; // 直接放行
        }

        // 2. 从请求中提取 Token（根据前端传递方式调整，常见有 3 种）
        String token = null;
        // 方式1：从请求头提取（推荐，如 Authorization: Bearer xxx）
        String authHeader = request.getHeader("Authorization");
        System.out.println(authHeader);
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            token = authHeader.substring(7); // 截取 "Bearer " 后面的 Token
        }
        // 3. 校验 Token（调用你现有的 getUserByToken 逻辑）
        if (token == null || token.isEmpty()) {
            // Token 不存在，返回 401
            send401Response(response, "请先登录");
            return false;
        }
        Users users = usersService.getUserByToken(token);
        if (users == null) {
            // Token 无效/过期，返回 401
            send401Response(response, "登录已到期，请重新登录");
            return false;
        }

        // 4. Token 有效：可将用户信息存入 Request 域（后续接口需要时直接获取，无需重复查库）
        request.setAttribute("currentUser", users);

        // 5. 放行请求，继续执行后续接口（如你的 /getuser 接口）
        return true;
    }

    /**
     * 统一返回 401 响应（格式与你的 R 类一致）
     */
    private void send401Response(HttpServletResponse response, String msg) throws Exception {
        // 设置响应格式为 JSON
        response.setContentType("application/json;charset=UTF-8");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // HTTP 状态码 401（标准身份未认证）

        // 构造 R.fail(401, msg) 的 JSON 字符串
        R failResult = R.fail(401, msg);
        String json = JSONObject.toJSONString(failResult); // 需导入 fastjson 依赖（或用 Jackson）

        // 写入响应
        response.getWriter().write(json);
        response.getWriter().flush();
    }
}